PinpointのWebhookカスタムチャネルを試してみた
こんにちは。たかやまです。
PinpointにはLambdaやWebhookを呼び出すカスタムチャネル機能があります。
Lambdaを使用したカスタムチャネルの使い方はちらほらブログがありますが、Webhookを使ったカスタムチャネルの情報がなかったので今回こちらの機能をためしてみたいと思います。
さきにまとめ
- Webhookを利用するには対象のWebhookのレスポンスヘッダに
X-Amz-Pinpoint-AccountId
にアカウントIDが含まれている必要がある - レスポンスヘッダの仕様もあり、直接SaaSのWebhookを呼び出す機能ではない
やってみた
Webhookカスタムチャネルの仕様確認
Webhook.site作成
冒頭で書いている通り、SaaSのWebhookは使えないのですが試しにWebhook.siteで生成したWebhookを登録してみたいと思います。
サイトを開くと自動でWebhook用のURLが生成されるのでこちらを控えます。
セグメント作成
静的セグメント作成します。
検証用にダミーのカスタムセグメントを用意します。
ChannelType,Address,User.UserAttributes.Name CUSTOM,dummy,たかやま
キャンペーン作成
次にWebhookを呼び出すキャンペーンを作成します。
チャネルはカスタム
を選択します。
セグメントはさきほど作成したものを指定します。
チャネルタイプをURL
、送信先のチャネルURLに最初に作成したWebhook.siteのURLを指定します。
キャンペーンの送信タイミングは即時を選択し、キャンペーンを起動します。
この時点では、以下のエラーメッセージが出てきてキャンペーンを作成できないことがわかります。
"Message" : "Amazon Pinpoint received an invalid response from the resource at the specified URL. Verify that you specified the correct URL."
Webhook.siteを確認すると、登録時にPinpointがHEADリクエストを飛ばしていることが確認できます。
この時に、レスポンスヘッダーにX-Amz-Pinpoint-AccountId
に自身のアカウントIDが含まれていなければWebhookを登録できない仕様となっています。
Webhook URL を指定するキャンペーンを作成すると、Amazon Pinpoint はその URL に HTTP HEAD を発行します。HEAD リクエストに対する応答には、X-Amz-Pinpoint-AccountId というヘッダーが含まれている必要があります。このヘッダーの値は、AWS アカウント ID と同じである必要があります。
Amazon Pinpoint でカスタムチャンネルの作成 - Amazon Pinpoint
ちなみにWebhook.siteのレスポンスヘッダーの内容はこちらです。
X-Amz-Pinpoint-AccountId
は含まれてないですね。
$curl -I https://webhook.site/9f9319f5-cdfc-4d7d-8923-d338ba35ea56 HTTP/1.1 200 OK Server: nginx Content-Type: text/plain; charset=UTF-8 Vary: Accept-Encoding X-Request-Id: 5c44e8b1-93d1-4fd1-9b4e-0592a9515499 X-Token-Id: 9f9319f5-cdfc-4d7d-8923-d338ba35ea56 Cache-Control: no-cache, private Date: Sun, 04 Sep 2022 14:30:00 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Methods: * Access-Control-Allow-Headers: * Access-Control-Expose-Headers: Content-Length,Content-Range
Webhookを作成してカスタムチャネルに登録してみる
今度はレスポンスヘッダーを設定したWebhookを用意して、カスタムチャネルに登録していきたいと思います。
API Gateway
API GatewayでレスポンスヘッダーにX-Amz-Pinpoint-AccountId
を設定したWebhookを用意します。
REST APIで作成していきます。
プロトコルの選択では、RESTで新規APIを作成します。
レスポンスヘッダーを設定したいだけなので、Mock
でHEAD
メソッドを作成していきます。
メソッドレスポンス
にX-Amz-Pinpoint-AccountId
ヘッダーを設定します。
統合レスポンス
にさきほど設定した X-Amz-Pinpoint-AccountId ヘッダーに自身のアカウントID
を設定します。
※この時マッピングの値はシングルクォート''
で囲んでください。
Webhook受け用のPOST
メソッドを設定していきます。
事前にeventをログ出力するLambdaを作成しておきます。
セットアップで作成したLambdaを指定します。
HEAD、POSTメソッド設定後、デプロイを実施します。
作成されたURLをメモします。
Pinpoint
再度キャンペーン作成を行い、送信先のチャネルURLに作成したAPI GatwayのURLを指定します。
キャンペーン作成を実施すると、今回は無事作成できることが確認できます。
Lambdaのログを確認すると、キャンペーン作成時に指定したセグメント情報が送られていることがわかります。
{ "Message": {}, "ApplicationId": "8b18ad998c564f3083b15099ce86feef", "CampaignId": "eb25534521024be2ae1b2f557ee3c18a", "TreatmentId": "0", "ActivityId": "f59bf0736d674e949b9151fffc1bfc78", "ScheduledTime": "2022-09-05T04:40:29.390Z", "Endpoints": { "gpw4beabbyf3d3puqv4wjadl5xs": { "ChannelType": "CUSTOM", "Address": "dummy", "EndpointStatus": "ACTIVE", "OptOut": "NONE", "EffectiveDate": "2022-09-04T08:25:00.784Z", "User": { "UserAttributes": { "Name": [ "たかやま" ] } }, "CohortId": "96", "CreationDate": "2022-09-04T08:00:24.731Z" } } }
あとは、Lambda側でこのセグメント情報をもとによしなに処理する実装をしていく形になります。
やってみて
試した通りレスポンスヘッダーの仕様もあるため、外部SaaSを直接呼び出すといった使い方はできません。
すでに管理しているWebhookがあり、Pinpointと連携したいといったユースケースがある場合にはこちらのWebhookカスタムチャネルをご活用できるのかなと思います。
(他にいいユースケースがあれば教えて下さい!)
新規にカスタムチャネルを利用する場合には、Lambdaを直接呼び出すのが簡単で良いかと思います。
最後に
カスタムチャネルのユースケースでLambdaを使うパターンはいくつかありますが、Webhookの使ったケースがなかったのでブログにしてみました。
当初はSaaSのWebhookを呼び出せるものかと思ってましたが、そういうものではないと使ってみてわかりました。
ぜひ、Webhookカスタムチャネルを試してみたい方の参考になれば幸いです。
以上、たかやまで(@nyan_kotaroo)した。